package com.woniu.mgr.util;

import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.VelocityTemplateEngine;

import java.util.ArrayList;
import java.util.List;

// 代码生成器
public class GeneratorUtil {
    
    public static void main(String[] args) {
        // 1.创建代码生成器对象
        AutoGenerator generator = new AutoGenerator();

        // 2.全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");// 项目所在路径 固定写法
        globalConfig.setOutputDir(projectPath + "/src/main/java");// 代码生成路径
        globalConfig.setAuthor("Silas");// 设置作者
        globalConfig.setServiceName("%sService");// 设置Service类名前缀
        globalConfig.setMapperName("%sDao");// 设置Dao类名前缀
        globalConfig.setOpen(false);// 是否打开生成目录
        generator.setGlobalConfig(globalConfig);// 将全局配置对象加入到代码生成器对象

        // 3.数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl("jdbc:mysql://xzy103.top:3306/yoga?charsetEncoding=utf-8&useSSL=false");
        dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");
        dataSourceConfig.setUsername("root");
        dataSourceConfig.setPassword("CQ_woniu_yujiaguan_90>_<");
        generator.setDataSource(dataSourceConfig);// 将数据源配置对象加入到代码生成器对象

        // 4.包配置
        PackageConfig packageConfig = new PackageConfig();
        packageConfig.setParent("com.woniu.mgr");// 设置父包路径
        packageConfig.setEntity("model");// 设置实体类位置
        packageConfig.setMapper("dao");// 设置dao类位置
        packageConfig.setService("service");// 设置service类位置
        packageConfig.setServiceImpl("service.impl");// 设置serviceImpl类位置
        packageConfig.setController("controller");// 设置controller类位置
        generator.setPackageInfo(packageConfig);// 将包配置对象加入到代码生成器对象

        // 5.自定义输出文件配置（此处为自定义输出Dao.xml文件）
        String templatePath = "/templates/mapper.xml.vm";// 模板引擎为velocity写此行（见pom.xml中的maven依赖）
        FileOutConfig outConfig = new FileOutConfig(templatePath) {// 自定义输出文件的配置
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出xml文件名 如果Entity实体类设置了前后缀 此处注xml的名称会跟着发生变化
                String path = projectPath + "/src/main/resources/mapper/";// xml文件所在路径
                String fileName = tableInfo.getEntityName() + "Dao";// xml文件名
                String xmlFile = StringPool.DOT_XML;// xml文件后缀
                return path + fileName + xmlFile;// 返回文件完整路径名
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();// 自定义输出文件配置列表
        focList.add(outConfig);

        // 6.自定义配置
        InjectionConfig injectionConfig = new InjectionConfig() {
            @Override// to do nothing
            public void initMap() {}
        };
        injectionConfig.setFileOutConfigList(focList);// 向自定义配置中加入自定义输出文件配置列表
        generator.setCfg(injectionConfig);// 将自定义配置对象加入到代码生成器对象

        // 7.模板配置
        TemplateConfig templateConfig = new TemplateConfig();
        templateConfig.setXml(null);// 如果不写此行 生成器会默认生成/templates/mapper.xml文件
        generator.setTemplate(templateConfig);// 将模板配置对象加入到代码生成器对象

        // 8.代码生成策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);// 实体类加上lombok注解
        strategy.setRestControllerStyle(true);
        strategy.setTablePrefix("yoga_");// 表名去前缀
        strategy.setInclude("yoga_account_role");// 指定代码生成策略包含某张表
        //strategy.setExclude("account");// 指定代码生成策略排除某张表
        generator.setStrategy(strategy);// 将代码生成策略对象加入到代码生成器对象

        // 9.设置模板引擎
        VelocityTemplateEngine engine = new VelocityTemplateEngine();
        generator.setTemplateEngine(engine);// 将模板引擎对象加入到代码生成器对象

        // 10.执行代码生成器
        generator.execute();
    }

}